| AKI PIC877ベーシックを使いタイマー制御作成 | 
            
              | まずタイマー制御の製作にかかります 古いベーシック言語のマイコンですが、素人用に簡単なコマンドで扱えるとても便利なマイコンです
 今は、発売されておりません
 | 
            
              |  CPU PIC16F877 動作クロック20MHz
 I/Oポート33ポート
 A/Dコンバーター8ポート
 自分で作ったプログラムはフラッシュROMに記録されます、プログラムの書き換えは1000回程度可能です。
 原寸は40mm×26mmと小さく、マイコンの入門や試作に最適です。
 | 
            
              |  まずパソコンでPICベーシックに操作させたいプログラムを入力いたします、今回はタイマー制御プログラム、LCD液晶表示プログラムを製作します。 フロチャート流れはこんな感じタイマーセット用ボリュームを右回転に回すとLCD表示中のタイマーが0秒から最大5分まで徐々にカウントUPされていきます、任意の時間で回転を止め、タイマー開始タクトスイッチを押すと外部制御リレー電源が働き、同時にタイマーのカウントダウウンが始まります。
 タイマーが0秒になると、リレーが切れ、またスタート待ちうけ状態に戻ります。
 
 | 
            
              |  AKI PIC-basicをライター(書き込み装置)にセットします、パソコンとライターをRS232Cで接続します 製作したプログラムをPCから書き込み支持を与えるとRC-232Cを経由してAKI PIC-basicにデータが書き込まれます
 
 余談
 私はプログラム開発はWIN98で作成しています、PC処理能力が遅くても十分対応でき、最新型PCでも使えますが、今のPCはアップデート(自動更新)するとソフトの動きがおかしくなる場合が多く、その点WIN98ならアップデートはマイクロソフトで対応していないのでこれ以上ソフトの書き換えが無く安定してソフト開発に集中できます。
 
 | 
            
              | 'ボリュームタイマーでリレー Dim j,ad,min,sec 'Word宣言
 Initlcd          'LCD初期化
 
 loop_data_input:
 
 Clearlcd                       'LCDクリア
 Homelcd                        'LCD書き込みポジションをHOMEにする
 Adc 5,0,ad                     'RE0(5ch)の電圧をA/D変換する
 ad  = ad / 4                   'A/D変換分解能を1024から256程度に下げる
 min = ad / 60                  'A/D変換値を分秒に分解する
 sec = ad - ( 60 * min )        '
 If min >= 10 Then              '分表示の桁合わせ判断
 Putlcd  min, " min / "       '
 Else                           '
 Putlcd  " ", min, " min / "  '1桁はスペースを挿入
 Endif                          '
 If sec >= 10 Then              '秒表示の桁合わせ判断
 Putlcd  sec, " sec / "       '
 Else                           '
 Putlcd  " ", sec, " sec / "  '1桁はスペースを挿入
 Endif                          '
 For j = 0 To 20                '21回繰り返す
 Sleep 10                      '約0.2秒毎にLCD表示する
 If rb.Bit0 = 0 Then timer_job 'SW1を押したらタイマージョブに飛ぶ
 
 Next j                         '3行上に飛ぶ
 Goto loop_data_input           '上側ループ、データ、インプットヘ飛ぶ
 
 timer_job:
 If rb.Bit0 = 0 Then High re.Bit1'SW1を押すとRE(リレー)をHIにする
 For j = ad To 1 Step -1        'タイマー待ちループ
 Homelcd                        '
 Clearlcd                       'LCDをクリア
 Putlcd "Time= ", j             '残り時間の表示
 Sleep 1000                     '1秒待つ
 Next j                         '
 Toggle re.Bit1                 'REポートの入力と出力反転
 Goto loop_data_input           '1番上に戻る
 | 
            
              | 接続端子配列 
                
                  
                    | コネクターA | 端子名 | 機能 | コネクターC | 端子名 | 機能 |  
                    | CNA-01 | RE0 | タイマーVR接続 | CNC-01 | RB7 | LCD D7 |  
                    | CNA-02 | RE1 | リレー用トランジスター接続 | CNC-02 | RB6 | LCD D6 |  
                    |  | CNC-03 | RB5 | LCD D5 |  
                    | CNC-04 | RB4 | LCD D4 |  
                    | CNC-05 | RB3 | LCD E |  
                    | CNC-06 | RB2 | LCD RS |  
                    | CNC 08 | RB0 | スタートSW1 |  
                    | CNC-09 | Vcc | 5V出力 LCD&リレー |  
                    | CNC-10 | GND | グランド |  
                    | CNC-11 | MCLR/Vpp | リセット信号、マイコンリセット |  
                    | CNC-14 | POWER | 電源7〜12V入力 |  | 
            
              |  いつも手書きの回路図を書いています 下にアルドゥイーノ側とAKI PIC側と分けて書きます。
 | 
            
              |  アルドゥイーノ側の基盤です aki pic877から送られた電源で瞬時に方位を決め作動するのでこちら側は配線が少なく済みます。
 | 
            
              |  
 aki pic877モジュール側の基盤です
 タイマーカウント制御で決められた時間内アルドゥイーノに電源を供給しタイマーが0秒になったらリレーをオフ、電源を遮断してアルドゥイーノを停止と共に船を停船させます。
 | 
            
              | ハネウェル HMC6352 デジタルコンパスモジュールをアルドゥイーノ制御 | 
            
              |  ここでは簡単なデジタルコンパスの説明をします デジタルコンパスモジュールは単品では何もできません
 ここではコンパスモジュールがどのようなデーターを送り出しているかアルドゥイーノに接続して研究してみましょう
 | 
            
              |   デジタルコンパスは方位を計測するだけの部品ですアルドゥイーノマイコンと接続してデジタルコンパスを制御してみましょう
 | 
            
              | //HMC6352で方位取得 //方位取得シリアル表示のみ
 //pin GND
 //A4=SDA
 //A5=SCL
 //VDD=5v
 //小数点有りタイプ12,00表示違い
 
 #include <Wire.h>
 #define I2C_addr 0x21 // デジタルコンパスのアドレス 0x42 >> 1
 void setup() {
 Wire.begin();
 Serial.begin(9600);  // モード設定
 Wire.beginTransmission(I2C_addr);
 Wire.write('G');   // コマンド発行
 Wire.write(0x74);  // RAM アドレス指定
 Wire.write(0x72);  // 20 Hz
 // Periodic Reset
 // Continuous Mode
 Wire.endTransmission();
 delay(1);
 }
 void loop() {
 unsigned int deg_dat;   // 角度データ用変数
 deg_dat = getDeg();
 Serial.println((double)deg_dat / 10);
 }
 // 角度データの取得用関数
 unsigned int getDeg(void) {
 unsigned int ret = 0;
 Wire.requestFrom(I2C_addr, 2);
 while(Wire.available() < 2);
 ret = Wire.read();  // MSB
 ret = ret << 8;
 ret += Wire.read(); // LSB
 delay(50);
 return (ret);
 }
 | 
            
              | 
                
                  
                    | コンパスモジュール側 | 機能 | アルドゥイーノ 側 | 機能 |  
                    | GND 端子番号1 | アース | GND | アース |  
                    | SDA 端子番号2 | SDA | A4 | アナログポート |  
                    | SCL 端子番号3 | SCL | A5 | アナログポート |  
                    | VVC 端子番号4 | 5V入力 | 5V | 5V出力 |  | 
            
              |  デジタル コンパスとアルドゥイーノをI2C接続します デジタルコンパスからはXとY座標から自動的に方位が計算され出力されてきます。
 | 
            
              |  WIN PCでアルドゥイーノソフト、シリアルポートを開け、デジタルコンパスがどのように出力されているか確認することができます。 | 
            
              | 方位検知と舵操船方法 | 
            
              |  オートパイロットは言葉で書くと北に方位を決め真直ぐ走り始めます、船が西に向けば舵を北に向け北方向に戻ったら舵を真直ぐにします 逆に東に船が向いてしまった場合北に舵を向けて方位が北に戻ったら舵を真直ぐにします
 しかしここで問題がありますデジタルコンパスは東西南北で制御出力されません
 
 デジタルコンパスから送られてくる情報は北が0度東が90度 南が180度 西が270度 細かく1度単位度で送られてきます
 例えば、オートパイロットで西(270度)に目標方位をセットします、マイコンの処理は目標方位、西270度より数字の大きい北方向280度に船が向いた場合、西270度に戻すため左に舵をきります、逆に南260度に向いた場合西270度に戻すため右に舵をきります
 マイコンの処理はセット方位西270度=Wより<なら左に舵Wより>であれば右に舵制御されています
 しかし北だけ問題があります目標方位北0度=Nより<ならではなく>にしないと左右反対の舵になりでたらめな操船になってしまいます
 
 上記の事から北方位、0度の場合をマイコンで計算処理しなければなりません、なんだかめんどくさいですね、ゴチャゴチャソフトを開発したら、難なくプログラムは完成しましたが、もう少し簡単なソフトを書き終えたらソースコードを公開します、今しばらくお待ちください。
 | 
            
              | 純正基盤に割り込み | 
            
              |  ラジコンボートの純正基盤にデジタルコンパスの指示をアルドゥイーノを通じて配線を割り込み制御させます。 | 
            
              |  実装基盤は多層基盤ではありませんでした、ラッキー配線図が読みやすい、しかし集積回路で改造が難しい状態、しかしまたしてもラッキー、モーター制御用トランジスターがデカデカ付いていましたのでその配線をたどり右用モーター左用モーターに割り込み後は電源+とグランド-端子を繋ぎ4本の線で製作した基盤と接続しております あと純正電源スイッチは取り外しバッテリーを接続したら強制的にオンにしまし
 |